package com.yunxi.module.system.service.notice.impl;

import com.google.common.annotations.VisibleForTesting;
import com.yunxi.framework.common.exception.util.ServiceExceptionUtil;
import com.yunxi.framework.common.pojo.PageResult;
import com.yunxi.framework.common.util.object.BeanUtils;
import com.yunxi.module.system.enums.constant.ErrorCodeConstants;
import com.yunxi.module.system.mapper.notice.NoticeMapper;
import com.yunxi.module.system.model.notice.NoticeDO;
import com.yunxi.module.system.service.notice.NoticeService;
import com.yunxi.module.system.vo.admin.notify.message.notice.NoticePageReqVO;
import com.yunxi.module.system.vo.admin.notify.message.notice.NoticeSaveReqVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * <p>
 * 通知公告 Service 接口实现类
 * </p>
 *
 * @author lidy
 * @since 2024-05-08
 */
@Service
public class NoticeServiceImpl implements NoticeService {

    @Resource
    private NoticeMapper noticeMapper;

    /**
     * 获得通知公告分页列表哦
     *
     * @param reqVO 查询条件
     * @return 分页列表
     */
    @Override
    public PageResult<NoticeDO> getNoticePage(NoticePageReqVO reqVO) {
        return noticeMapper.selectPage(reqVO);
    }

    /**
     * 获得通知公告
     *
     * @param noticeId 编号
     * @return 通知公告
     */
    @Override
    public NoticeDO getNotice(Long noticeId) {
        return noticeMapper.selectById(noticeId);
    }

    /**
     * 创建通知公告
     *
     * @param createReqVO 内容
     * @return 公告ID
     */
    @Override
    public Long createNotice(NoticeSaveReqVO createReqVO) {
        NoticeDO notice = BeanUtils.toBean(createReqVO, NoticeDO.class);
        noticeMapper.insert(notice);
        return notice.getId();
    }

    /**
     * 修改通知公告
     *
     * @param updateReqVO 内容
     */
    @Override
    public void updateNotice(NoticeSaveReqVO updateReqVO) {
        // 校验是否存在
        validateNoticeExists(updateReqVO.getId());

        // 更新
        NoticeDO updateObj = BeanUtils.toBean(updateReqVO, NoticeDO.class);
        noticeMapper.updateById(updateObj);
    }

    /**
     * 删除通知公告
     *
     * @param noticeId 编号
     */
    @Override
    public void deleteNotice(Long noticeId) {
        // 校验是否存在
        validateNoticeExists(noticeId);
        // 删除
        noticeMapper.deleteById(noticeId);
    }

    /**
     * 校验是否存在
     *
     * @param noticeId 公告编号
     */
    @VisibleForTesting
    private void validateNoticeExists(Long noticeId) {
        if (noticeId == null) {
            return;
        }
        NoticeDO noticeDO = noticeMapper.selectById(noticeId);
        if (noticeDO == null) {
            throw ServiceExceptionUtil.exception(ErrorCodeConstants.NOTICE_NOT_FOUND);
        }
    }
}
